﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _3DFileConverter
{
    class StlFigure:Figure {

        float areaOfTheFacet;
        float volumeOfTheFacet;

        List<VertexProp> verteces;

        public StlFigure(){
            areaOfTheFacet = 0;
            volumeOfTheFacet = 0;
            verteces = new List<VertexProp>();
        }

        internal List<VertexProp> Verteces {
            get{
                return verteces;
            }
        }

        public float calculateFacetVolume() {
            float v321 = verteces.ElementAt(2).X *
                verteces.ElementAt(1).Y * verteces.ElementAt(0).Z;
            float v231 = verteces.ElementAt(1).X *
                verteces.ElementAt(2).Y * verteces.ElementAt(0).Z;
            float v312 = verteces.ElementAt(2).X *
                verteces.ElementAt(0).Y * verteces.ElementAt(1).Z;
            float v132 = verteces.ElementAt(0).X *
                verteces.ElementAt(2).Y * verteces.ElementAt(1).Z;
            float v213 = verteces.ElementAt(1).X *
                verteces.ElementAt(0).Y * verteces.ElementAt(2).Z;
            float v123 = verteces.ElementAt(0).X *
                verteces.ElementAt(1).Y * verteces.ElementAt(2).Z;

            return volumeOfTheFacet = Math.Abs((1.0f / 6.0f) *
                (-v321 + v231 + v312 - v132 - v213 + v123));
        }

        public float calculateFacetArea() {

            float v21x = verteces.ElementAt(1).X
                            - verteces.ElementAt(0).X;
            float v21y = verteces.ElementAt(1).Y
                            - verteces.ElementAt(0).Y;
            float v21z = verteces.ElementAt(1).Z
                            - verteces.ElementAt(0).Z;

            float v31x = verteces.ElementAt(2).X
                            - verteces.ElementAt(0).X;
            float v31y = verteces.ElementAt(2).Y
                            - verteces.ElementAt(0).Y;
            float v31z = verteces.ElementAt(2).Z
                            - verteces.ElementAt(0).Z;

            float cpX = v21y * v31z - v21z * v31y;
            float cpY = v21z * v31x - v21x * v31z;
            float cpZ = v21x * v31y - v21y * v31x;

            return areaOfTheFacet = 0.5f * 
                (float)Math.Sqrt(cpX * cpX + cpY * cpY + cpZ * cpZ);

        }
    }
}
